数学模型

Wang Haihua

🍈 🍉🍊 🍋 🍌


零件参数设计

问题

一件产品由若干零件组装而成, 标志产品 性能的某个参数取决于这些零件的参数。零件参数包括标定值和容差两部 分。进行成批生产时, 标定值表示一批零件该参数的平均值, 容差则给出了 参数偏离其标定值的容许范围。若将零件参数视为随机变量, 则标定值代表 期望值, 在生产部门无特殊要求时, 容差通常规定为均方差的 3 倍。

分析

进行零件参数设计,就是要确定其标定值和容差。这时要考虑两方面因素:
(1)当各零件组装成产品时,如果产品参数偏离预先设定的目标值,就会造成质量损失,偏离越大,损失越大;
(2)零件容差的大小决定了其制造成本,容差设计得越小,成本越高。

建模

粒子分离器某参数 (记作 $y$ ) 由 7 个零件的参数 (记作 $x_{1}, x_{2}, \cdots, x_{7}$ ) 决 定, 经验公式为 $$ y=174.42\left(\frac{x_{1}}{x_{5}}\right)\left(\frac{x_{3}}{x_{2}-x_{1}}\right)^{0.85} \sqrt{\frac{1-2.62\left[1-0.36\left(\frac{x_{4}}{x_{2}}\right)^{-0.56}\right]^{3 / 2}\left(\frac{x_{4}}{x_{2}}\right)^{1.16}}{x_{6} x_{7}}} . $$ $y$ 的目标值(记作 $y_{0}$ ) 为 1.50。当 $y$ 偏离 $y_{0} \pm 0.1$ 时, 产品为次品, 质量损 失为 1000 元; 当 $y$ 偏离 $y_{0} \pm 0.3$ 时, 产品为废品, 损失为 9000 元。

零件参数的标定值有一定的容许变化范围;容差分为 $A 、 B 、 C$ 三个等 级, 用与标定值的相对值表示, $A$ 等为 $\pm 1 \%, B$ 等为 $\pm 5 \%, C$ 等为 $\pm 10 \%$ 。 7 个零件参数标定值及容差如表 $16.3$ 所示。求每件产品的平均损失。

x_(1) x_(2) x_(3) x_(4) x_(5) x_(6) x_(7)
标定值 0.1 0.3 0.1 0.1 1.5 16 0.75
容在 B B B C C B B

求解

在这个问题中, 主要的困难是产品的参数值 $y$ 是一个随机变量, 而 由于 $y$ 与各零件参数间是一个复杂的函数关系, 无法解析地得到 $y$ 的概率分 布。采用随机模拟的方法计算, 这一方法的思路其实很简单, 用计算机模拟 工厂生产大量“产品” (如 100000 件), 计算产品的总损失, 从而得到每件 产品的平均损失。可以假设 7 个零件参数服从正态分布。根据表 $16.3$ 数据 及标定值和容差的定义,

$$ x_{1} \sim N\left(0.1,(0.005 / 3)^{2}\right), x_{2} \sim N\left(0.3,(0.005)^{2}\right), x_{3} \sim N\left(0.1,(0.005 / 3)^{2}\right) \text {, } $$

$x_{4} \sim N\left(0.1,(0.01 / 3)^{2}\right), \quad x_{5} \sim N\left(1.5,0.05^{2}\right), \quad x_{6} \sim N\left(16,(0.8 / 3)^{2}\right)$, $x_{7} \sim N\left(0.75,0.0125^{2}\right)$ 。下面的 Python 程序产生 100000 对零件参数随机数, 通过随机模拟法求得每件产品的平均损失约为 2500 元。

*代码

import numpy as np
N=100000; mu=[0.1, 0.3, 0.1, 0.1, 1.5, 16, 0.75]
cov=np.diag([(0.005/3)**2,0.005**2,(0.005/3)**2,
    (0.01/3)**2, 0.05**2, (0.8/3)**2, 0.0125**2])
a=np.random.multivariate_normal(mu,cov,size=N)
x1,x2,x3,x4,x5,x6,x7 = a.T
y=174.42*x1/x5*(x3/(x2-x1))**0.85*np.sqrt((1-2.62*(1-0.36*
         (x4/x2)**(-0.56))**(3/2)*(x4/x2)**1.16)/(x6*x7))
d=np.abs(y-1.5)
f=np.sum(9000*(d>=0.3)+1000*((d<0.3)&(d>=0.1)))/N
print("平均损失为:",f)